This R notebook is to showcase examples of analyses that can be done based on Twitter-data and Twitter-meta-data.
Let’s focus on a more relevant topic, say the currently ongoing NBA Playoffs, since Twitter only makes recent tweets available. Additionally, not all teams are equal, in the sense that more popular teams will have more relevant Twitter activity and less popular teams will have less. So, let’s compare the Twitter activity of the two teams in last year’s NBA Playoff Finals - Cleveland Cavaliers & Golden State Warriors.
Note: While Twitter allows a maximum of 3600 tweets to be grabbed at once, this is a slow process. Thus, we choose to grab n=3000 tweets whenever searchTwitter() from the twitteR package is called. Further, Twitter has restricted acces to its API, meaning too many requests to access Twitter’s API in a short period of time leads to an error. There is no way to get around that, so we must be careful how many calls to access Twitter’s API in a certain period of time we make. Otherwise, we have to wait, before trying again.
Wordcloud:
The following is a word cloud based on tweets about the Cavaliers:

The following is a word cloud based on tweets about the Warriors:

Sentiment Analysis: (NRC Lexicon; 10 sentiments)
First, let’s look at the sentiment analysis of tweets about the Cleveland Cavaliers. Users tweeting about the Cavs use first and foremost positive words though negative words are a close third. Clearly, we can deduce that positive sentiments are from Cavs fans. However, negative sentiment may come from fans of rival teams (perhaps specifically fans of currently opposing team, the Pacers) and disappointed fans. The second most common sentiment in tweets about the Cavs is anticipation, which is not surprising as playoff games bring about a build-up of energy and emotions. The two weakest sentiments are anger and surprise which makes sense, since the Cavs won all 4 of their Round 1 games against the Pacers. Fans don’t really have anything to be angry about and fans ought not be surprised since they by virtue of being fans expect their team to win.
Here are the ten most common positive words in the 3000 tweets about the Cavaliers:
Here are the ten most common negative words in the 3000 tweets about the Cavaliers:
Now, let’s look at the sentiment analysis of tweets about the Golden State Warriors. By an overwhelming amount, the positive sentiment is strongest across all the tweets about the Warriors (even stronger than positive sentiment among tweets about the Cavs, at least in terms of number of positive words). Though unlike with the tweets about the Cavs that had the sentiment negative as the thrid strongest sentiment, tweets about the Warriors have the sentiment joy as the third strongest sentiment. This further affirms that the dialogue surrounding the Warriors is generally more positive and happy than that regarding the Cavs. Similar to tweets about the Cavs, tweets about the Warriors have anticipation as the second strongest sentiment. Further notable is that trust is tied for the third strongest sentiment (along with joy) here. So, it seems those who tweet about the Warriors, presumably fans, are more confident and pleased, than those who tweet about the Cavs.
Here are the ten most common positive words in the 3000 tweets about the Warriors:
Here are the ten most common negative words in the 3000 tweets about the Warriors:
Extension:
Analyzing Twitter data and meta-data allows us some insight into what people talk about and how they talk about them. Although we focused on the behavior and emotions of Cavaliers and Warriors fan, similar analyses can extend to other segments of Twitter users. We created a short interactive html notebook that takes a user-supplied term and searches Twitter’s API for the user-specified number of tweets mentioning the term. The output is a data table of the latest 5 relevant tweets and a wordcloud based on the tweets. Additionally, the user can download a .csv file with data from status objects returned by searchTwitter(). Below are screenshots of a few examples:
1) Term = “NBA”; nTweets = 5


2) Term = “life”; nTweets = 5


3) Term = “life”; nTweets = 123


LS0tCnRpdGxlOiAiRXhwbG9yYXRvcnkgQW5hbHlzaXMgd2l0aCBEYXRhIE1pbmVkIGZyb20gVHdpdHRlciIKZmlnX3dpZHRoOiA2Cm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdApmaWdfaGVpZ2h0OiA0Ci0tLQogIApUaGlzIFIgbm90ZWJvb2sgaXMgdG8gc2hvd2Nhc2UgZXhhbXBsZXMgb2YgYW5hbHlzZXMgdGhhdCBjYW4gYmUgZG9uZSBiYXNlZCBvbiBUd2l0dGVyLWRhdGEgYW5kIFR3aXR0ZXItbWV0YS1kYXRhLiAgCiAgCkxldCdzIGZvY3VzIG9uIGEgbW9yZSByZWxldmFudCB0b3BpYywgc2F5IHRoZSBjdXJyZW50bHkgb25nb2luZyBOQkEgUGxheW9mZnMsIHNpbmNlIFR3aXR0ZXIgb25seSBtYWtlcyByZWNlbnQgdHdlZXRzIGF2YWlsYWJsZS4gQWRkaXRpb25hbGx5LCBub3QgYWxsIHRlYW1zIGFyZSBlcXVhbCwgaW4gdGhlIHNlbnNlIHRoYXQgbW9yZSBwb3B1bGFyIHRlYW1zIHdpbGwgaGF2ZSBtb3JlIHJlbGV2YW50IFR3aXR0ZXIgYWN0aXZpdHkgYW5kIGxlc3MgcG9wdWxhciB0ZWFtcyB3aWxsIGhhdmUgbGVzcy4gU28sIGxldCdzIGNvbXBhcmUgdGhlIFR3aXR0ZXIgYWN0aXZpdHkgb2YgdGhlIHR3byB0ZWFtcyBpbiBsYXN0IHllYXIncyBOQkEgUGxheW9mZiBGaW5hbHMgLSBDbGV2ZWxhbmQgQ2F2YWxpZXJzICYgR29sZGVuIFN0YXRlIFdhcnJpb3JzLiAgCiAgCioqTm90ZToqKiBXaGlsZSBUd2l0dGVyIGFsbG93cyBhIG1heGltdW0gb2YgMzYwMCB0d2VldHMgdG8gYmUgZ3JhYmJlZCBhdCBvbmNlLCB0aGlzIGlzIGEgc2xvdyBwcm9jZXNzLiBUaHVzLCB3ZSBjaG9vc2UgdG8gZ3JhYiBuPTMwMDAgdHdlZXRzIHdoZW5ldmVyIGBgYHNlYXJjaFR3aXR0ZXIoKWBgYCBmcm9tIHRoZSBgYGB0d2l0dGVSYGBgIHBhY2thZ2UgaXMgY2FsbGVkLiBGdXJ0aGVyLCBUd2l0dGVyIGhhcyByZXN0cmljdGVkIGFjY2VzIHRvIGl0cyBBUEksIG1lYW5pbmcgdG9vIG1hbnkgcmVxdWVzdHMgdG8gYWNjZXNzIFR3aXR0ZXIncyBBUEkgaW4gYSBzaG9ydCBwZXJpb2Qgb2YgdGltZSBsZWFkcyB0byBhbiBlcnJvci4gVGhlcmUgaXMgbm8gd2F5IHRvIGdldCBhcm91bmQgdGhhdCwgc28gd2UgbXVzdCBiZSBjYXJlZnVsIGhvdyBtYW55IGNhbGxzIHRvIGFjY2VzcyBUd2l0dGVyJ3MgQVBJIGluIGEgY2VydGFpbiBwZXJpb2Qgb2YgdGltZSB3ZSBtYWtlLiBPdGhlcndpc2UsIHdlIGhhdmUgdG8gd2FpdCwgYmVmb3JlIHRyeWluZyBhZ2Fpbi4gIAogIAojIyMgQ2hhcnRpbmcgV2hlbiBUd2VldHMgV2VyZSBDcmVhdGVkOiAgCldlIG1heSB3YW50IHRvIGNocm9uaWNsZSB0d2VldHMgZnJvbSBhIGdpdmVuIHVzZXIncyBUaW1lbGluZS4gQmVsb3csIHdlIGNocm9uaWNsZSB0aGUgcmVjZW50IDMwMDAgdHdlZXRzIG9uIHRoZSBvZmZpY2lhbCBDbGV2ZWxhbmQgQ2F2YWxpZXJzIFR3aXR0ZXIgYW5kIHRoZSByZWNlbnQgMzAwMCB0d2VldHMgb24gdGhlIG9mZmljaWFsIEdvbGRlbiBTdGF0ZSBXYXJyaW9ycyBUd2l0dGVyLiBBbHNvLCB3ZSBtYXJrZWQgdGhlIGRhdGVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCB0ZWFtJ3MgcGxheW9mZiBnYW1lcy4gRm9yIHRoZSBXYXJyaW9ycywgYXMgZmFyIGFzIHRoZSBsYXN0IDQgZ2FtZXMgZ28sIFR3aXR0ZXIgYWN0aXZpdHkgYnkgb2ZmaWNpYWwgXEB3YXJyaW9ycyBzZWVtcyB0byBiZSBjb25jZW50cmF0ZWQgaW4gdGhlIHRpbWUgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGEgZ2FtZS4gRm9yIHRoZSBDYXZzLCBhcyBmYXIgYXMgdGhlIGxhc3QgNCBnYW1lcyBnbywgVHdpdHRlciBhY3Rpdml0eSBieSBvZmZpY2lhbCBcQGNhdnMgc2VlbXMgdG8gbW9yZSBhdmVyYWdlbHkgc3ByZWFkIGFjcm9zcyB0aGUgdGltZSBiZWZvcmUsIGR1cmluZywgYW5kIGFmdGVyIGEgZ2FtZS4gVGhvc2UgdHdlZXRzIGluIGJldHdlZW4gZ2FtZXMsIGZvciBib3RoIG9mZmljaWFsIHRlYW0gYWNjb3VudHMsIGNhbiBwcm9iYWJseSBiZSBhY2NvdW50ZWQgZm9yIGJ5IHByb21vdGlvbmFsIHR3ZWV0cywgZS5nLiB0d2VldHMgcHJvbW90aW5nIHRoZSBzYWxlIG9mIHRpY2tldHMuIFNlZWluZyBhcyBob3cgdGhpcyBpcyBvbmx5IHRoZSBiZWdpbm5pbmcgb2YgdGhlIFBsYXlvZmZzLCBpLmUuLCBSb3VuZCAxLCBvZiBjb3Vyc2UgdGhlcmUgaXMgYSBoaWdoIHZvbHVtZSBvZiB0d2VldHMgaW4gdGhlIGxhc3QgZmV3IGRheXMgcmVmbGVjdGluZyB0aGUgbW9tZW50dW0gb2Ygc29jaWFsIG1lZGlhIGFjdGl2aXR5IGFzIGh5cGUgZm9yIHRoZSBzdWNjZXNzaXZlIGdhbWVzIHJpc2VzLiBBcyBmb3IgdGhlIHNwcmVhZCBvZiB0d2VldHMgcmVmZXJlbmNpbmcgZWl0aGVyIHRlYW0gYnkgbm9uLXRlYW0tb2ZmaWNpYWwgYWNjb3VudHMsIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhleSB3b3VsZCBjb25jZW50cmF0ZSBpbiB0aGUgbGFzdCBmZXcgZGF5cywgZ2l2ZW4gdGhlIHJlc3RyaWN0aW9uIG9mIHRoZSBudW1iZXIgb2YgdHdlZXRzIHdlJ3JlIGFibGUgdG8gYWNjZXNzLiBTbywgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgY29uY2x1c2lvbiB0aGF0IGNhbiBiZSBkcmF3biBmcm9tIGNocm9uaWNsaW5nIGFsbCBUd2l0dGVyIHVzZXIgdHdlZXRzIGFib3V0IHRoZSBHb2xkZW4gU3RhdGUgV2FycmlvcnMgYW5kIENsZXZlbGFuZCBDYXZhbGllcnMuICAKYGBge3IsZWNobz1GLGluY2x1ZGU9VH0KbG9hZCgiLi4vb3V0cHV0L3dhcl9jYXZzX2NyZWF0ZWQuUmRhdGEiKQp3YXJfY2F2c19jcmVhdGVkCmBgYAogIAojIyMgQnJlYWtkb3duIG9mIFR3ZWV0cyBieSB0aGUgSG91cjogIApXZSBjYW4gbG9vayBtb3JlIGluIGRldGFpbCBhdCB0d2VldHMgZnJvbSB0aGUgb2ZmaWNpYWwgXEB3YXJyaW9ycyBhbmQgXEBjYXZzIGFjY291bnRzIGJhc2VkIG9uIGhvdXIgb2YgZGF5LiBBZ2FpbiwgZnJvbSB0aGUgMzAwMCB0d2VldHMgZ3JhYmJlZCBmcm9tIFR3aXR0ZXIsIHdlIHBsb3QgdGhlIHBlcmNlbnRhZ2Ugb2YgdHdlZXRzIGFzIGEgZnVuY3Rpb24gb2YgdGhlIGhvdXIgb2YgdGhlIGRheSAoaW4gRWFzdGVybiBTdGFuZGFyZCBUaW1lKS4gTm90aWNlIHRoYXQgdGhlIG9mZmljaWFsIFxAY2F2cyBoYXMgaXRzIGhpZ2hlc3QgcGVyY2VudGFnZSBvZiB0d2VldHMgcG9zdGVkIGJldHdlZW4gMXBtIGFuZCAycG0uIFRoaXMgc2VlbXMgdG8gYmUgcmVsYXRlZCB0byB0aGUgZmFjdCB0aGF0IDIgb2YgdGhlIDQgQ2F2cyBnYW1lcyBoYXZlIGJlZW4gYXQgMXBtIGFuZCAzcG0uIEFkZGl0aW9uYWxseSwgdGhlIHNlY29uZCBwZWFrIGFib3V0IDhwbSBpcyByZWxhdGVkIHRvIHRoZSBvdGhlciAyIGdhbWVzIGF0IDdwbS4gVGhlIGhpZ2hlciBwZWFrIGJldHdlZW4gMXBtIGFuZCAycG0gY2FuIGJlIGF0dHJpYnV0ZWQgdG8gdGhlIGZhY3QgdGhhdCB0aG9zZSAyIGVhcmx5IGFmdGVybm9vbiBnYW1lcyB3ZXJlIG9uIHRoZSB3ZWVrZW5kLiBUaHVzLCBpdCBtYWtlcyBzZW5zZSB0aGF0IG1vcmUgcGVvcGxlIGFyZSBmcmVlIHRvIHdhdGNoIHdlZWtlbmQsIHJhdGhlciB0aGFuIHdlZWtkYXksIGdhbWVzLiBTbywgb2ZmaWNpYWwgYXQgXEBjYXZzIG1heSB0d2VldCBtb3JlIG9uIHRoZSB3ZWVrZW5kcyB0byByZWFjaCBhIGxhcmdlciBhdWRpZW5jZS4gVGhlIHNhbWUgbG9naWMgYXBwbGllcyB0byB0aGUgdHJlbmQgd2Ugc2VlIGluIHRoZSBncmFwaCBvZiBwZXJjZW50YWdlIG9mIHR3ZWV0cyBieSBob3VyIGZvciB0aGUgV2FycmlvcnMuIFNpbmNlIDMgb2YgdGhlIDQgV2FycmlvcnMgZ2FtZXMgd2VyZSBhdCAxMDozMHBtLCB0aGUgZ3JlYXRlc3QgcGVhayBhcm91bmQgbWlkbmlnaHQgbWFrZXMgc2Vuc2UuIFRoZSBzZWNvbmQgcGVhayBpcyBhdHRyaWJ1dGVkIHRvIHRoZSA0dGggZ2FtZSB0aGF0IHdlbnQgb24gYXQgM3BtLiBPZmZpY2lhbHMgZm9yIGJvdGggdGhlIENhdnMgYW5kIFdhcnJpb3JzIGFyZSBwcm9iYWJseSB0d2VldGluZyBnYW1lIGhpZ2hsaWdodHMgYW5kIHJlY2Fwcy4gCmBgYHtyLGVjaG89RixpbmNsdWRlPVR9CmxvYWQoIi4uL291dHB1dC9jYXZzT19ieUhSLlJkYXRhIikKbG9hZCgiLi4vb3V0cHV0L3dhcnJpb3JzT19ieUhSLlJkYXRhIikKY2F2c09fYnlIciA7IHdhcnJpb3JzT19ieUhyCmBgYAogIApOb3cgaGVyZSBpcyB0aGUgYnJlYWtkb3duIG9mIHR3ZWV0cyBmcm9tIG5vbi10ZWFtLW9mZmljaWFsIFR3aXR0ZXIgdXNlcnMuIFRoZSBDYXZzIHdvbiBhbGwgZm91ciBvZiB0aGVpciBSb3VuZCAxIGdhbWVzIGFnYWluc3QgdGhlIFBhY2Vycy4gQnV0IHRoZWlyIGZpcnN0IGdhbWUgb24gQXByaWwgMTUgYXQgM3BtIHdhcyB0aGUgY2xvc2VzdCwgYXMgQ2F2cyBiZWF0IFBhY2VycyBieSAxIHBvaW50ICgxMDktMTA4KS4gU28gdGhlIGh5cGUgb2YgdGhlIGZpcnN0IGdhbWUgYW5kIHRoZSBjbG9zZSBzY29yZSB3b3VsZCBleHBsYWluIHRoZSBoaWdoZXN0IHBlYWsgb2YgVHdpdHRlciBhY3Rpdml0eSwgZXhjZXB0IHRoYXQgdHdlZXRzIHdlcmUgZnJvbSBBcHJpbCAyNHRoLTI2dGguIFdpdGhvdXQgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBDYXZzIGZhbnMgKG9yIGF0IGxlYXN0IHRob3NlIHdobyB0d2VldCBhYm91dCB0aGUgQ2F2cyksIHdlIGNhbid0IGNvbmNsdWRlIGFueXRoaW5nIGFib3V0IHR3aXR0ZXIgdXNlcnMgdHdlZXRpbmcgYWJvdXQgdGhlIENhdnMuIEZ1cnRoZXIsIGZvciB0aG9zZSB0d2VldGluZyBhYm91dCB0aGUgV2FycmlvcnMsIHdlIG1heSBzcGVjdWxhdGUgdGhhdCB0aGUgdGltZSBkaWZmZXJlbmNlIGJldHdlZW4gRWFzdCBDb2FzdCBhbmQgV2VzdCBDb2FzdCBjb250cmlidXRlIHRvIHRoZSBoaWdoZXN0IHBlYWsgYXQgbm9vbiBFU1QuIFNpbmNlIG1vc3QgZmFucyBvZiB0aGUgV2FycmlvcnMgYXJlIHByb2JhYmx5IG9uIFBhY2lmaWMgU3RhbmRhcmQgVGltZSwgZm9yIHRoZSBjb250ZXh0IG9mIHdoZW4gdGhleSdyZSB0d2VldGluZyBpbiB0aGUgZGF5LCB3ZSBzaG91bGQgY29uc2lkZXIgdHdlZXRzIGluIFBTVC4gU28gdGhlbiwgYXQgYXJvdW5kIDlhbSBQU1QsIHR3ZWV0cyBhYm91dCB0aGUgV2FycmlvcnMgYXJlIGF0IHRoZSBoaWdoZXN0IGxldmVsLiBQZXJoYXBzLCBtYW55IGZhbnMgZG9uJ3Qgd2F0Y2ggdGhlIGdhbWVzIGluIHJlYWwtdGltZSwgYW5kIHdhdGNoIHJlY2FwcyB0aGUgbmV4dCBtb3JuaW5nLiBUaGF0IHdvdWxkIGNlcnRhaW5seSBhY2NvdW50IGZvciB0aGUgbW9ybmluZyB0d2VldHMgYWJvdXQgdGhlIFdhcnJpb3JzLiBBZ2Fpbiwgd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyBmb3IgY2VydGFpbiB3aXRob3V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgVHdpdHRlciB1c2VycycgdHdlZXRpbmcgYmVoYXZpb3IuICAKYGBge3IsZWNobz1GLGluY2x1ZGU9VH0KbG9hZCgiLi4vb3V0cHV0L2NhdnNBbGxfYnlIUi5SZGF0YSIpCmxvYWQoIi4uL291dHB1dC93YXJyaW9yc0FsbF9ieUhSLlJkYXRhIikKY2F2c0FsbF9ieUhyOyB3YXJyaW9yc0FsbF9ieUhyCmBgYAogIAojIyMgV29yZGNsb3VkOiAKVGhlIGZvbGxvd2luZyBpcyBhIHdvcmQgY2xvdWQgYmFzZWQgb24gdHdlZXRzIGFib3V0IHRoZSBDYXZhbGllcnM6ICAKYGBge3IsIGVjaG89RixpbmNsdWRlPVR9CmxpYnJhcnkoRUJJbWFnZSkgCkNhdnNDbG91ZCA9IHJlYWRJbWFnZSgnLi4vZmlncy9DYXZzQ2xvdWQucG5nJykgCmRpc3BsYXkoQ2F2c0Nsb3VkLG1ldGhvZD0icmFzdGVyIikgCmBgYAogIApUaGUgZm9sbG93aW5nIGlzIGEgd29yZCBjbG91ZCBiYXNlZCBvbiB0d2VldHMgYWJvdXQgdGhlIFdhcnJpb3JzOiAgCmBgYHtyLGVjaG89RixpbmNsdWRlPVR9CldhcnJpb3JzQ2xvdWQgPSByZWFkSW1hZ2UoJy4uL2ZpZ3MvV2FycmlvcnNDbG91ZC5wbmcnKSAKZGlzcGxheShXYXJyaW9yc0Nsb3VkLG1ldGhvZD0icmFzdGVyIikgCmBgYAoKIyMjIEZyZXF1ZW50bHkgVXNlZCBXb3JkcyBBbW9uZyBhIFNldCBvZiBUd2VldHM6ICAKSGVyZSwgd2UgYW5hbHl6ZSBmcmVxdWVuY3kgb2Ygd29yZHMgdXNlZCBpbiB0d2VldHMgYnkgb2ZmaWNpYWwgdGVhbSBhY2NvdW50cyAtIFxAY2F2cyBhbmQgXEB3YXJyaW9ycyAtIGJ5IGxvb2tpbmcgYXQgYSBiYXIgZ3JhcGguIFRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCB0ZXJtIGluIG9mZmljaWFsIFxAY2F2cyB0d2VldHMgaXMgJ1wjZGVmZW5kdGhlbGFuZCcuIFRoaXMgaGFzaHRhZyBpcyBvYnZpb3VzbHkgb25lIHRoYXQgdGhlIHRlYW0gaXMgdHJ5aW5nIHRvIGFzc29jaWF0ZSBpdHNlbGYgd2l0aCBhbmQgbWFrZSB0cmVuZHkgc28gdGhhdCBvdGhlciBUd2l0dGVyIHVzZXJzIG1heSB1c2UgdGhlIGhhc2h0YWcgaW4gcmVmZXJlbmNlIHRvIHRoZSBDYXZzLiBUaGUgc2Vjb25kIG1vc3QgZnJlcXVlbnRseSB1c2VkIHRlcm0gaXMgJ1wjY2F2c3BhY2VycycsIHdoaWNoIGlzIG5vIHN1cnByaXNlIGFzIHRoZSBSb3VuZCAxIGdhbWVzIGhhdmUgQ2F2cyBhZ2FpbnN0IFBhY2Vycy4gT3RoZXIgd29yZHMgdGhhdCBhcHBlYXIgaW4gdGhpcyBjaGFydCBhcmUgYWxzbyB2ZXJ5IG11Y2ggaW4gbGluZSB3aXRoIHByb21vdGlvbmFsIHR3ZWV0cyB0aGF0IFxAY2F2cyBwb3N0cy4gQXMgZm9yIHRoZSBvZmZpY2lhbHMgYXQgXEB3YXJyaW9ycywgbm90YWJseSwgdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkIHRlcm0gaXMgJ1wjZHVibmF0aW9uJywgd2l0aCB3aGljaCB0aGUgdGVhbSBpcyB0cnlpbmcgdG8gYXNzb2NpYXRlLiBUaGlzIHBhcnRpY3VsYXIgaGFzaHRhZyBoYXMgYnJvYWRlciBwcmVjZWRlbnQgaW4gdGhlIGNvbnRleHQgb2YgQ2FsaWZvcm5pYSwgc28gaXRzIHVzYWdlIGJ5IFxAd2FycmlvcnMgaXMgc3RyYXRlZ2ljIHRvIHJlYWNoIG1vcmUgZmFucy4gQW5vdGhlciBub3RhYmxlIHRlcm0gaXMgcGVyaGFwcyAnd2luJywgd2hpY2ggZGlkIG5vdCBhcHBlYXIgaW4gdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkIHdvcmRzIGJ5IFxAY2F2cy4gVGhpcyBzdWdnZXN0cyB0aGF0IHR3ZWV0cyBmcm9tIFxAd2FycmlvcnMgYXJlIG1vcmUgcG9zaXRpdmUgdGhhbiB0aG9zIGZyb20gXEBjYXZzLiBTaW1pbGFyIHRvIHR3ZWV0cyBmcm9tIFxAY2F2cywgbWFueSBvZiB0aGUgZnJlcXVlbnRseSB1c2VkIHdvcmRzIHRoYXQgYXBwZWFyIGluIHRoZSBjaGFydCBzZXJ2ZSB0byBpbmZvcm0gYXVkaWVuY2VzIGFuZCBwcm9tb3RlIHZpZXdlcnNoaXAgb2YgZ2FtZXMuICAKYGBge3IsZWNobz1GLGluY2x1ZGU9VH0KbG9hZCgiLi4vb3V0cHV0L2NhdnNPX3dvcmRfY3RfYmFyLlJkYXRhIikKbG9hZCgiLi4vb3V0cHV0L3dhcnJpb3JzT193b3JkX2N0X2Jhci5SZGF0YSIpCmNhdnNPX3dvcmRfY3RfYmFyIDsgd2FycmlvcnNPX3dvcmRfY3RfYmFyCmBgYAogIAojIyMgU2VudGltZW50IEFuYWx5c2lzOiAgKE5SQyBMZXhpY29uOyAxMCBzZW50aW1lbnRzKSAgCkZpcnN0LCBsZXQncyBsb29rIGF0IHRoZSAqKnNlbnRpbWVudCBhbmFseXNpcyBvZiB0d2VldHMgYWJvdXQgdGhlIENsZXZlbGFuZCBDYXZhbGllcnMqKi4gVXNlcnMgdHdlZXRpbmcgYWJvdXQgdGhlIENhdnMgdXNlIGZpcnN0IGFuZCBmb3JlbW9zdCBwb3NpdGl2ZSB3b3JkcyB0aG91Z2ggbmVnYXRpdmUgd29yZHMgYXJlIGEgY2xvc2UgdGhpcmQuIENsZWFybHksIHdlIGNhbiBkZWR1Y2UgdGhhdCBwb3NpdGl2ZSBzZW50aW1lbnRzIGFyZSBmcm9tIENhdnMgZmFucy4gSG93ZXZlciwgbmVnYXRpdmUgc2VudGltZW50IG1heSBjb21lIGZyb20gZmFucyBvZiByaXZhbCB0ZWFtcyAocGVyaGFwcyBzcGVjaWZpY2FsbHkgZmFucyBvZiBjdXJyZW50bHkgb3Bwb3NpbmcgdGVhbSwgdGhlIFBhY2VycykgYW5kIGRpc2FwcG9pbnRlZCBmYW5zLiBUaGUgc2Vjb25kIG1vc3QgY29tbW9uIHNlbnRpbWVudCBpbiB0d2VldHMgYWJvdXQgdGhlIENhdnMgaXMgYW50aWNpcGF0aW9uLCB3aGljaCBpcyBub3Qgc3VycHJpc2luZyBhcyBwbGF5b2ZmIGdhbWVzIGJyaW5nIGFib3V0IGEgYnVpbGQtdXAgb2YgZW5lcmd5IGFuZCBlbW90aW9ucy4gVGhlIHR3byB3ZWFrZXN0IHNlbnRpbWVudHMgYXJlIGFuZ2VyIGFuZCBzdXJwcmlzZSB3aGljaCBtYWtlcyBzZW5zZSwgc2luY2UgdGhlIENhdnMgd29uIGFsbCA0IG9mIHRoZWlyIFJvdW5kIDEgZ2FtZXMgYWdhaW5zdCB0aGUgUGFjZXJzLiBGYW5zIGRvbid0IHJlYWxseSBoYXZlIGFueXRoaW5nIHRvIGJlIGFuZ3J5IGFib3V0IGFuZCBmYW5zIG91Z2h0IG5vdCBiZSBzdXJwcmlzZWQgc2luY2UgdGhleSBieSB2aXJ0dWUgb2YgIGJlaW5nIGZhbnMgZXhwZWN0IHRoZWlyIHRlYW0gdG8gd2luLiAgCmBgYHtyLGVjaG89RixpbmNsdWRlPVR9CiNzZW50aW1lbnQgYW5hbHlzaXMgb2YgdHdlZXRzIGFib3V0IHRoZSBDYXZzCmxvYWQoIi4uL291dHB1dC9jYXZzQWxsX3NlbnRpLlJkYXRhIikKY2F2c0FsbF9zZW50aQpgYGAKICAKSGVyZSBhcmUgdGhlIHRlbiBtb3N0IGNvbW1vbiBwb3NpdGl2ZSB3b3JkcyBpbiB0aGUgMzAwMCB0d2VldHMgYWJvdXQgdGhlIENhdmFsaWVyczogIApgYGB7cixlY2hvPUYsaW5jbHVkZT1UfQojIDEwIG1vc3QgY29tbW9uIHBvc2l0aXZlIHdvcmRzIGluIHR3ZWV0cyBhYm91dCB0aGUgQ2F2cwpsb2FkKCIuLi9vdXRwdXQvY2F2c0FsbF9wb3MuUmRhdGEiKQpoZWFkKGNhdnNBbGxfcG9zLDEwKQpgYGAKICAKSGVyZSBhcmUgdGhlIHRlbiBtb3N0IGNvbW1vbiBuZWdhdGl2ZSB3b3JkcyBpbiB0aGUgMzAwMCB0d2VldHMgYWJvdXQgdGhlIENhdmFsaWVyczogIApgYGB7cixlY2hvPUYsaW5jbHVkZT1UfQojIDEwIG1vc3QgY29tbW9uIG5lZ2F0aXZlIHdvcmRzIGluIHR3ZWV0cyBhYm91dCB0aGUgQ2F2cwpsb2FkKCIuLi9vdXRwdXQvY2F2c0FsbF9uZWcuUmRhdGEiKQpoZWFkKGNhdnNBbGxfbmVnLDEwKQpgYGAKICAKICAKTm93LCBsZXQncyBsb29rIGF0IHRoZSAqKnNlbnRpbWVudCBhbmFseXNpcyBvZiB0d2VldHMgYWJvdXQgdGhlIEdvbGRlbiBTdGF0ZSBXYXJyaW9ycyoqLiBCeSBhbiBvdmVyd2hlbG1pbmcgYW1vdW50LCB0aGUgcG9zaXRpdmUgc2VudGltZW50IGlzIHN0cm9uZ2VzdCBhY3Jvc3MgYWxsIHRoZSB0d2VldHMgYWJvdXQgdGhlIFdhcnJpb3JzIChldmVuIHN0cm9uZ2VyIHRoYW4gcG9zaXRpdmUgc2VudGltZW50IGFtb25nIHR3ZWV0cyBhYm91dCB0aGUgQ2F2cywgYXQgbGVhc3QgaW4gdGVybXMgb2YgbnVtYmVyIG9mIHBvc2l0aXZlIHdvcmRzKS4gVGhvdWdoIHVubGlrZSB3aXRoIHRoZSB0d2VldHMgYWJvdXQgdGhlIENhdnMgdGhhdCBoYWQgdGhlIHNlbnRpbWVudCBuZWdhdGl2ZSBhcyB0aGUgdGhyaWQgc3Ryb25nZXN0IHNlbnRpbWVudCwgdHdlZXRzIGFib3V0IHRoZSBXYXJyaW9ycyBoYXZlIHRoZSBzZW50aW1lbnQgam95IGFzIHRoZSB0aGlyZCBzdHJvbmdlc3Qgc2VudGltZW50LiBUaGlzIGZ1cnRoZXIgYWZmaXJtcyB0aGF0IHRoZSBkaWFsb2d1ZSBzdXJyb3VuZGluZyB0aGUgV2FycmlvcnMgaXMgZ2VuZXJhbGx5IG1vcmUgcG9zaXRpdmUgYW5kIGhhcHB5IHRoYW4gdGhhdCByZWdhcmRpbmcgdGhlIENhdnMuIFNpbWlsYXIgdG8gdHdlZXRzIGFib3V0IHRoZSBDYXZzLCB0d2VldHMgYWJvdXQgdGhlIFdhcnJpb3JzIGhhdmUgYW50aWNpcGF0aW9uIGFzIHRoZSBzZWNvbmQgc3Ryb25nZXN0IHNlbnRpbWVudC4gRnVydGhlciBub3RhYmxlIGlzIHRoYXQgdHJ1c3QgaXMgdGllZCBmb3IgdGhlIHRoaXJkIHN0cm9uZ2VzdCBzZW50aW1lbnQgKGFsb25nIHdpdGggam95KSBoZXJlLiBTbywgaXQgc2VlbXMgdGhvc2Ugd2hvIHR3ZWV0IGFib3V0IHRoZSBXYXJyaW9ycywgcHJlc3VtYWJseSBmYW5zLCBhcmUgbW9yZSBjb25maWRlbnQgYW5kIHBsZWFzZWQsIHRoYW4gdGhvc2Ugd2hvIHR3ZWV0IGFib3V0IHRoZSBDYXZzLiAgCmBgYHtyLGVjaG89RixpbmNsdWRlPVR9CiNzZW50aW1lbnQgYW5hbHlzaXMgb2YgdHdlZXRzIGFib3V0IHRoZSBXYXJyaW9ycwpsb2FkKCIuLi9vdXRwdXQvd2FycmlvcnNBbGxfc2VudGkuUmRhdGEiKQp3YXJyaW9yc0FsbF9zZW50aQpgYGAKICAKSGVyZSBhcmUgdGhlIHRlbiBtb3N0IGNvbW1vbiBwb3NpdGl2ZSB3b3JkcyBpbiB0aGUgMzAwMCB0d2VldHMgYWJvdXQgdGhlIFdhcnJpb3JzOiAgCmBgYHtyLGVjaG89RixpbmNsdWRlPVR9CiMgMTAgbW9zdCBjb21tb24gcG9zaXRpdmUgd29yZHMgaW4gdHdlZXRzIGFib3V0IHRoZSBXYXJyaW9ycwpsb2FkKCIuLi9vdXRwdXQvd2FycmlvcnNBbGxfcG9zLlJkYXRhIikKaGVhZCh3YXJyaW9yc0FsbF9wb3MsMTApCmBgYAogIApIZXJlIGFyZSB0aGUgdGVuIG1vc3QgY29tbW9uIG5lZ2F0aXZlIHdvcmRzIGluIHRoZSAzMDAwIHR3ZWV0cyBhYm91dCB0aGUgV2FycmlvcnM6ICAKYGBge3IsZWNobz1GLGluY2x1ZGU9VH0KIyAxMCBtb3N0IGNvbW1vbiBuZWdhdGl2ZSB3b3JkcyBpbiB0d2VldHMgYWJvdXQgdGhlIFdhcnJpb3JzCmxvYWQoIi4uL291dHB1dC93YXJyaW9yc0FsbF9uZWcuUmRhdGEiKQpoZWFkKHdhcnJpb3JzQWxsX25lZywxMCkKYGBgCgogIAojIyMgRXh0ZW5zaW9uOiAgCkFuYWx5emluZyBUd2l0dGVyIGRhdGEgYW5kIG1ldGEtZGF0YSBhbGxvd3MgdXMgc29tZSBpbnNpZ2h0IGludG8gd2hhdCBwZW9wbGUgdGFsayBhYm91dCBhbmQgaG93IHRoZXkgdGFsayBhYm91dCB0aGVtLiBBbHRob3VnaCB3ZSBmb2N1c2VkIG9uIHRoZSBiZWhhdmlvciBhbmQgZW1vdGlvbnMgb2YgQ2F2YWxpZXJzIGFuZCBXYXJyaW9ycyBmYW4sIHNpbWlsYXIgYW5hbHlzZXMgY2FuIGV4dGVuZCB0byBvdGhlciBzZWdtZW50cyBvZiBUd2l0dGVyIHVzZXJzLiBXZSBjcmVhdGVkIGEgc2hvcnQgaW50ZXJhY3RpdmUgaHRtbCBub3RlYm9vayB0aGF0IHRha2VzIGEgdXNlci1zdXBwbGllZCB0ZXJtIGFuZCBzZWFyY2hlcyBUd2l0dGVyJ3MgQVBJIGZvciB0aGUgdXNlci1zcGVjaWZpZWQgbnVtYmVyIG9mIHR3ZWV0cyBtZW50aW9uaW5nIHRoZSB0ZXJtLiBUaGUgb3V0cHV0IGlzIGEgZGF0YSB0YWJsZSBvZiB0aGUgbGF0ZXN0IDUgcmVsZXZhbnQgdHdlZXRzIGFuZCBhIHdvcmRjbG91ZCBiYXNlZCBvbiB0aGUgdHdlZXRzLiBBZGRpdGlvbmFsbHksIHRoZSB1c2VyIGNhbiBkb3dubG9hZCBhIGBgYC5jc3ZgYGAgZmlsZSB3aXRoIGRhdGEgZnJvbSBgYGBzdGF0dXNgYGAgb2JqZWN0cyByZXR1cm5lZCBieSBgYGBzZWFyY2hUd2l0dGVyKClgYGAuIEJlbG93IGFyZSBzY3JlZW5zaG90cyBvZiBhIGZldyBleGFtcGxlczogIAogIAoqKjEpIFRlcm0gPSAiTkJBIjsgblR3ZWV0cyA9IDUqKiAgCmBgYHtyLGVjaG89RixpbmNsdWRlPVR9ClNjcmVlblNob3RfMSA9IHJlYWRJbWFnZSgnLi4vZmlncy9TY3JlZW5TaG90XzEucG5nJykgCmRpc3BsYXkoU2NyZWVuU2hvdF8xLG1ldGhvZD0icmFzdGVyIikgCgpTY3JlZW5TaG90XzIgPSByZWFkSW1hZ2UoJy4uL2ZpZ3MvU2NyZWVuU2hvdF8yLnBuZycpIApkaXNwbGF5KFNjcmVlblNob3RfMixtZXRob2Q9InJhc3RlciIpIApgYGAKICAKKioyKSBUZXJtID0gImxpZmUiOyBuVHdlZXRzID0gNSoqICAKYGBge3IsZWNobz1GLGluY2x1ZGU9VH0KU2NyZWVuU2hvdF8zID0gcmVhZEltYWdlKCcuLi9maWdzL1NjcmVlblNob3RfMy5wbmcnKSAKZGlzcGxheShTY3JlZW5TaG90XzMsbWV0aG9kPSJyYXN0ZXIiKSAKClNjcmVlblNob3RfNCA9IHJlYWRJbWFnZSgnLi4vZmlncy9TY3JlZW5TaG90XzQucG5nJykgCmRpc3BsYXkoU2NyZWVuU2hvdF80LG1ldGhvZD0icmFzdGVyIikgCmBgYAogIAoqKjMpIFRlcm0gPSAibGlmZSI7IG5Ud2VldHMgPSAxMjMqKiAgCmBgYHtyLGVjaG89RixpbmNsdWRlPVR9ClNjcmVlblNob3RfNSA9IHJlYWRJbWFnZSgnLi4vZmlncy9TY3JlZW5TaG90XzUucG5nJykgCmRpc3BsYXkoU2NyZWVuU2hvdF81LG1ldGhvZD0icmFzdGVyIikgCgpTY3JlZW5TaG90XzYgPSByZWFkSW1hZ2UoJy4uL2ZpZ3MvU2NyZWVuU2hvdF82LnBuZycpIApkaXNwbGF5KFNjcmVlblNob3RfNixtZXRob2Q9InJhc3RlciIpIApgYGAKICAKICAK